package cn.edu.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.Map;

/**
 * @PackageName: cn.edu.utils
 * @ClassName: JWTUtils
 * @Description:
 * @author: RZS
 * @date: 2021/7/14  22:29
 */
public class JWTUtils {

    // 盐值、标记、密钥     用于加密与加密，生成加密的token
    private static final String SIGN = "ReJWT20HXgy@+!-#Bto%k*en";

    /**
     * 生成token   包含  头.载体.标签
     * @param map  载体数据，即需要往token中存放的数据
     * @return
     */
    public static String getToken(Map<String, String> map){
        // 构建JWT对象
        final JWTCreator.Builder builder = JWT.create();
        // 设置签发token时间
        builder.withIssuedAt(new Date(System.currentTimeMillis()));
        // 设置过期时间  一般默认30分钟
        builder.withExpiresAt(new Date(System.currentTimeMillis() + 1000*60*60*30));
        // 添加载体数据   采用lambda表达式写法
        map.forEach((k, v) -> builder.withClaim(k, v));
        /*
            // 采用普通得写法
            map.forEach(new BiConsumer<String, String>() {
                @Override
                public void accept(String k, String v) {
                    builder.withClaim(k, v);
                }
            });
        */

        // 生成token
        String token = builder.sign(Algorithm.HMAC256(SIGN));
        return  token;
    }

    /**
     * 验证token 合法性, 并返回信息对象
     *      获取token信息方法
     * @param token token字符串
     * @return
     */
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
    }

}
